package com.ufind.common.enums;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;

/**
 * 数据类型枚举
 */
public enum EDataType {

    STRING {
        @Override
        public String getValue(String value) {
            return StringUtils.isBlank(value) ? "" : value;
        }
    },
    INT {
        @Override
        public Integer getValue(String value) {
            return StringUtils.isBlank(value) ? 0 : Integer.valueOf(value);
        }
    },
    LONG {
        @Override
        public Long getValue(String value) {
            return StringUtils.isBlank(value) ? 0 : Long.valueOf(value);
        }
    },
    DOUBLE {
        @Override
        public Double getValue(String value) {
            return StringUtils.isBlank(value) ? 0 : Double.valueOf(value);
        }
    },
    BIG_DECIMAL {
        @Override
        public BigDecimal getValue(String value) {
            return StringUtils.isBlank(value) ? BigDecimal.ZERO : new BigDecimal(value);
        }
    },
    BOOLEAN {
        @Override
        public Boolean getValue(String value) {
            return StringUtils.isBlank(value) ? false : Boolean.valueOf(value);
        }
    },
    DATE {
        @Override
        public Date getValue(String value) {
            try {
                return StringUtils.isBlank(value) ? null : DateUtils.parseDate(value, DATE_FORMAT);
            } catch (ParseException e) {
                throw new IllegalArgumentException("'" + value + "' cannot be converted to Date" + e);
            }
        }
    },
    TIME {
        @Override
        public Date getValue(String value) {
            try {
                return StringUtils.isBlank(value) ? null : DateUtils.parseDate(value, TIME_FORMAT);
            } catch (ParseException e) {
                throw new IllegalArgumentException("'" + value + "' cannot be converted to Time" + e);
            }
        }
    },
    DATE_TIME {
        @Override
        public Date getValue(String value) {
            try {
                return StringUtils.isBlank(value) ? null : DateUtils.parseDate(value, DATE_TIME_FORMAT);
            } catch (ParseException e) {
                throw new IllegalArgumentException("'" + value + "' cannot be converted to DateTime" + e);
            }
        }
    };

    /**
     * 转换字符串值为相应数据类型形式的值。
     * @param value 字符串格式的值
     * @return 对象值
     */
    public abstract Object getValue(String value);

    /**
     * 日期格式
     */
    protected static final String DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 时间格式
     */
    protected static final String TIME_FORMAT = "hh:mm:ss";

    /**
     * 时间戳格式
     */
    protected static final String DATE_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
}
